#include "./Servidor.h"

Servidor::Servidor(const int& puerto) {
	this->puerto = puerto;
	cantidadDeClientes = 0;
}

Servidor::~Servidor() {
}

void Servidor::agregarCliente(Socket* socket) {
	server_Cliente *nuevoCliente;
	if (cantidadDeClientes < MAX_CLIENTES) {
		nuevoCliente = new server_Cliente();
		nuevoCliente->setSocket(socket);
		clientes.push_back(nuevoCliente);
		nuevoCliente->run();
	}
}

void Servidor::analizarClientesActivos() {
	std::list<server_Cliente*>::iterator it;
	for (it = clientes.begin(); it != clientes.end(); ++it) {
		if (!((*it)->estaActivo())) {
			(*it)->finalizar();
			(*it)->join();
			delete (*it);
			it = clientes.erase(it);
		}
	}
}

void Servidor::correr() {
	Socket* socketCliente = NULL;
	while (fdSocket.estaActivo()) {
		socketCliente = fdSocket.accept();
		if ((socketCliente != NULL) && (socketCliente->estaActivo())) {
			analizarClientesActivos();
			agregarCliente(socketCliente);
		}
	}
}

int Servidor::escucharConexiones() {
	int estado;
	estado = fdSocket.listen(this->puerto, MAX_CLIENTES);
	if (estado == -1) {
		perror("Error debido a");
		errno = 0;
	}
	return estado;
}

int Servidor::iniciar() {
	int estado;
	estado = escucharConexiones();
	if (estado != -1) {
		this->run();
	}
	return estado;
}

void Servidor::finalizarClientes() {
	std::list<server_Cliente*>::iterator it;
	for (it = clientes.begin(); it != clientes.end(); ++it) {
		(*it)->finalizar();
		(*it)->join();
		delete (*it);
		it = clientes.erase(it);
	}
}

void Servidor::finalizar() {
	finalizarClientes();
	if (fdSocket.estaActivo()) {
		fdSocket.shutdown();
		fdSocket.close();
	}
}
